/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fvsosp.telas;

import fvsosp.biblioteca.BibliotecaRN;
import fvsosp.emprestimo.Emprestimo;
import fvsosp.emprestimo.EmprestimoRN;
import fvsosp.exemplaremprestimos.ExemplarEmprestimos;
import fvsosp.exemplaremprestimos.ExemplarEmprestimosRN;
import fvsosp.emprestimo.ItensEmprestimoTableModel;
import fvsosp.exemplar.Exemplar;
import fvsosp.exemplar.ExemplarRN;
import fvsosp.leitor.Leitor;
import fvsosp.leitor.LeitorRN;
import fvsosp.leitor.LeitorTableModel;
import fvsosp.multa.Multa;
import fvsosp.multa.MultaRN;
import fvsosp.usuario.UsuarioRN;
import fvsosp.util.ConnectionFactory;
import fvsosp.util.OnlyNumberField;
import fvsosp.util.UsuarioAtivo;
import fvsosp.util.Util;
import java.awt.event.KeyEvent;
import java.sql.Connection;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.view.JasperViewer;

/**
 *
 * @author Tulio
 */
public class TelaCadastroEmprestimos extends javax.swing.JDialog {

    Emprestimo emprestimo;
    EmprestimoRN emprestimoRN = new EmprestimoRN();
    Leitor leitor;
    ExemplarEmprestimos exemplarEmprestimo = new ExemplarEmprestimos();
    LeitorRN leitorRN = new LeitorRN();
    Set<ExemplarEmprestimos> exemplares = new HashSet<>();

    /**
     * Creates new form TelaCadastroEmpr
     */
    public TelaCadastroEmprestimos() {
        initComponents();
        tfDataEmprestimoDia.setText("");
        lblDevolucao.setText("");
        tfTombo.setDocument(new OnlyNumberField());
        limpaCampos();
        setModal(true);
        setLocationRelativeTo(null);
    }

    public void atualizaTabela() {
        ItensEmprestimoTableModel iETB = new ItensEmprestimoTableModel(exemplares);
        tbExemplaresEmprestimo.setModel(iETB);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel9 = new javax.swing.JPanel();
        labelEmprestimo = new javax.swing.JLabel();
        jPanel7 = new javax.swing.JPanel();
        tfDataEmprestimoDia = new javax.swing.JFormattedTextField();
        labelDataEmprestimo5 = new javax.swing.JLabel();
        tfDataEmprestimoMes = new javax.swing.JFormattedTextField();
        tfDataEmprestimoAno = new javax.swing.JFormattedTextField();
        jLabel21 = new javax.swing.JLabel();
        jLabel22 = new javax.swing.JLabel();
        labelDataDevolucao17 = new javax.swing.JLabel();
        RemoveAcr = new javax.swing.JButton();
        labelDataEmprestimo7 = new javax.swing.JLabel();
        jScrollPane5 = new javax.swing.JScrollPane();
        tbExemplaresEmprestimo = new javax.swing.JTable();
        btNovo5 = new javax.swing.JButton();
        btSair5 = new javax.swing.JButton();
        btSalvar5 = new javax.swing.JButton();
        tfLeitor = new javax.swing.JTextField();
        btPesquisar6 = new javax.swing.JButton();
        tfTombo = new javax.swing.JTextField();
        btAdicionar = new javax.swing.JButton();
        lblDevolucao = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setModal(true);
        setResizable(false);
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jPanel9.setBackground(new java.awt.Color(59, 89, 152));
        jPanel9.setLayout(null);

        labelEmprestimo.setFont(new java.awt.Font("Verdana", 1, 24)); // NOI18N
        labelEmprestimo.setForeground(new java.awt.Color(255, 255, 255));
        labelEmprestimo.setText("Empréstimo/Devolução");
        jPanel9.add(labelEmprestimo);
        labelEmprestimo.setBounds(0, 0, 340, 30);

        getContentPane().add(jPanel9, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 360, 37));

        jPanel7.setBackground(new java.awt.Color(255, 255, 255));

        tfDataEmprestimoDia.setEditable(false);
        tfDataEmprestimoDia.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("##"))));
        tfDataEmprestimoDia.setToolTipText("Digite aqui o dia do Empréstimo.");
        tfDataEmprestimoDia.setFocusLostBehavior(javax.swing.JFormattedTextField.PERSIST);

        labelDataEmprestimo5.setFont(new java.awt.Font("Verdana", 0, 12)); // NOI18N
        labelDataEmprestimo5.setText("Data.:");

        tfDataEmprestimoMes.setEditable(false);
        tfDataEmprestimoMes.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("##"))));
        tfDataEmprestimoMes.setToolTipText("Digite aqui o mês de Empréstimo.");
        tfDataEmprestimoMes.setFocusLostBehavior(javax.swing.JFormattedTextField.PERSIST);

        tfDataEmprestimoAno.setEditable(false);
        tfDataEmprestimoAno.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("####"))));
        tfDataEmprestimoAno.setToolTipText("Digite aqui o ano de Empréstimo.");
        tfDataEmprestimoAno.setFocusLostBehavior(javax.swing.JFormattedTextField.PERSIST);

        jLabel21.setText("/");

        jLabel22.setText("/");

        labelDataDevolucao17.setFont(new java.awt.Font("Verdana", 0, 12)); // NOI18N
        labelDataDevolucao17.setText("Leitor.:");

        RemoveAcr.setText("Remover");
        RemoveAcr.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                RemoveAcrActionPerformed(evt);
            }
        });

        labelDataEmprestimo7.setFont(new java.awt.Font("Verdana", 0, 12)); // NOI18N
        labelDataEmprestimo7.setText("Tombo.: *");

        tbExemplaresEmprestimo.setFont(new java.awt.Font("Verdana", 0, 12)); // NOI18N
        tbExemplaresEmprestimo.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null},
                {null},
                {null},
                {null},
                {null},
                {null},
                {null}
            },
            new String [] {
                "Exemplares do Empréstimo"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tbExemplaresEmprestimo.setCellSelectionEnabled(true);
        jScrollPane5.setViewportView(tbExemplaresEmprestimo);
        tbExemplaresEmprestimo.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_INTERVAL_SELECTION);

        btNovo5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/fvsosp/imagens/novo_1.png"))); // NOI18N
        btNovo5.setToolTipText("Novo");
        btNovo5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btNovo5ActionPerformed(evt);
            }
        });

        btSair5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/fvsosp/imagens/SA.png"))); // NOI18N
        btSair5.setToolTipText("Sair");
        btSair5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btSair5ActionPerformed(evt);
            }
        });

        btSalvar5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/fvsosp/imagens/save_1.png"))); // NOI18N
        btSalvar5.setToolTipText("Salvar");
        btSalvar5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btSalvar5ActionPerformed(evt);
            }
        });

        tfLeitor.setToolTipText("Informe o Leitor");
        tfLeitor.setEnabled(false);

        btPesquisar6.setIcon(new javax.swing.ImageIcon(getClass().getResource("/fvsosp/imagens/application-form-magnify-icon.png"))); // NOI18N
        btPesquisar6.setToolTipText("Pesquise por um Leitor.");
        btPesquisar6.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btPesquisar6ActionPerformed(evt);
            }
        });

        tfTombo.setToolTipText("Informe o tombo");
        tfTombo.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                tfTomboKeyReleased(evt);
            }
            public void keyPressed(java.awt.event.KeyEvent evt) {
                tfTomboKeyPressed(evt);
            }
        });

        btAdicionar.setText("Adicionar");
        btAdicionar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btAdicionarActionPerformed(evt);
            }
        });

        lblDevolucao.setFont(new java.awt.Font("Arial", 1, 11)); // NOI18N
        lblDevolucao.setForeground(new java.awt.Color(255, 0, 0));
        lblDevolucao.setText("jLabel1");
        lblDevolucao.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        lblDevolucao.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lblDevolucaoMouseClicked(evt);
            }
        });

        javax.swing.GroupLayout jPanel7Layout = new javax.swing.GroupLayout(jPanel7);
        jPanel7.setLayout(jPanel7Layout);
        jPanel7Layout.setHorizontalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel7Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(jPanel7Layout.createSequentialGroup()
                        .addComponent(labelDataEmprestimo5)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(tfDataEmprestimoDia, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel21)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tfDataEmprestimoMes, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(6, 6, 6)
                        .addComponent(jLabel22, javax.swing.GroupLayout.PREFERRED_SIZE, 9, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tfDataEmprestimoAno, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jScrollPane5, javax.swing.GroupLayout.PREFERRED_SIZE, 336, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(jPanel7Layout.createSequentialGroup()
                        .addComponent(labelDataEmprestimo7)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(tfTombo, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btAdicionar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(RemoveAcr))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel7Layout.createSequentialGroup()
                        .addComponent(lblDevolucao)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(btNovo5, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btSalvar5, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btSair5)
                        .addGap(4, 4, 4))
                    .addGroup(jPanel7Layout.createSequentialGroup()
                        .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(labelDataDevolucao17)
                            .addComponent(tfLeitor, javax.swing.GroupLayout.PREFERRED_SIZE, 296, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(btPesquisar6, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel7Layout.setVerticalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel7Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(tfDataEmprestimoDia, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(tfDataEmprestimoAno, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel22, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(tfDataEmprestimoMes, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel21)
                    .addComponent(labelDataEmprestimo5, javax.swing.GroupLayout.PREFERRED_SIZE, 9, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(jPanel7Layout.createSequentialGroup()
                        .addComponent(labelDataDevolucao17)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tfLeitor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(btPesquisar6, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelDataEmprestimo7)
                    .addComponent(tfTombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btAdicionar)
                    .addComponent(RemoveAcr))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane5, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(btSair5)
                        .addComponent(btSalvar5, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(btNovo5, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(lblDevolucao))
                .addGap(41, 41, 41))
        );

        getContentPane().add(jPanel7, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 35, -1, 340));
        jPanel7.getAccessibleContext().setAccessibleParent(this);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btNovo5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btNovo5ActionPerformed
        limpaCampos();
    }//GEN-LAST:event_btNovo5ActionPerformed

    private void btSair5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btSair5ActionPerformed
        dispose();
    }//GEN-LAST:event_btSair5ActionPerformed

    private void btSalvar5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btSalvar5ActionPerformed
        if (JOptionPane.showConfirmDialog(rootPane, "Deseja efetuar o seguinte Empréstimo: "
                + "\nData de Empréstimo: " + tfDataEmprestimoDia.getText() + " / " + tfDataEmprestimoMes.getText()
                + " / " + tfDataEmprestimoAno.getText()
                + "\nLeitor: " + tfLeitor.getText()
                + "\nExemplar(es): " + exemplares.toString(), "OSBiblio", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {

            if (emprestimo == null) {
                emprestimo = new Emprestimo();
            }
            if (Util.chkVazio(tfDataEmprestimoDia.getText(), tfDataEmprestimoMes.getText(), tfDataEmprestimoAno.getText(),
                    tfLeitor.getText())
                    && exemplares.size() > 0) {
                String dataEmprestimo = tfDataEmprestimoDia.getText() + "/" + tfDataEmprestimoMes.getText() + "/" + tfDataEmprestimoAno.getText();
                try {
                    DateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");
                    UsuarioRN usuRN = new UsuarioRN();
                    emprestimo.setUsuario(usuRN.pesquisaLogin(UsuarioAtivo.getLogin()));
                    emprestimo.setDataEmprestimo(new Date(fmt.parse(dataEmprestimo).getTime()));
                    //emprestimo.setDataDevolucao(new Date(fmt.parse(dataDevolucao).getTime()));
                    emprestimo.setLeitor(leitor);

                    //emprestimo.setExemplares(exemplares);

                } catch (ParseException ex) {
                    System.out.println(ex.getMessage());
                }
                int id = emprestimo.getIdEmprestimo();
                emprestimo.setLeitor(leitor);
                if (emprestimoRN.adiciona(emprestimo)) {


                    ExemplarEmprestimosRN exemRN = new ExemplarEmprestimosRN();

                    Iterator<ExemplarEmprestimos> iterator = exemplares.iterator();

                    boolean seEemprestimo = false;
                    String itensOperadorInConsulta = "";
                    while (iterator.hasNext()) {
                        ExemplarEmprestimos exem = iterator.next();
                        if (exem.getEmprestimo() == null) {
                            exem.setEmprestimo(emprestimo);
                        }
                        if (exem.getOperacao() == 2) {
                            int quantDias = Util.diferencaData(exem.getDataEmprestimo(), exem.getDataDevolucao());
                            if (quantDias > leitor.getGruposLeitores().getDuracaoDiasEmprestimo()) {
                                MultaRN muRN = new MultaRN();
                                Multa multa = new Multa();
                                multa.setExemplarEmprestimo(exem);
                                multa.setPago(false);
                                int diasDiferenca = quantDias - leitor.getGruposLeitores().getDuracaoDiasEmprestimo();
                                multa.setValor(diasDiferenca * leitor.getGruposLeitores().getValorMultaDiaria());
                                muRN.salvar(multa);
                            }
                        }
                        exemRN.adiciona(exem);


                        Exemplar exemplar = exem.getExemplar();
                        ExemplarRN eRN = new ExemplarRN();
                        if ((exem.getOperacao() == 1) || (exem.getOperacao() == 3)) {
                            exemplar.setSituacao(3);
                            if (exem.getOperacao() == 1) {
                                seEemprestimo = true;
                            } else {
                                itensOperadorInConsulta += exemplar.getTombo();
                                if (iterator.hasNext()) {
                                    itensOperadorInConsulta += ",";
                                }

                            }
                        } else {
                            exemplar.setSituacao(1);
                            itensOperadorInConsulta += exemplar.getTombo();
                            if (iterator.hasNext()) {
                                itensOperadorInConsulta += ",";
                            }

                        }

                        eRN.adiciona(exemplar);
                    }
                        if (seEemprestimo) {
                        JOptionPane.showMessageDialog(rootPane, "Empréstimo " + ((id == 0) ? "cadastrado" : "alterado")
                                + " com sucesso!");
                    } else {
                        JOptionPane.showMessageDialog(rootPane, "Devolução/Renovação " + ((id == 0) ? "cadastrado" : "alterado")
                                + " com sucesso!");
                    }
                    JasperReport pathjrxml;
                    HashMap parametros = new HashMap();
                    String sql = "";

                    Connection connection = new ConnectionFactory().getConnection();
                    parametros.put("sql", sql);
                    BibliotecaRN bRN = new BibliotecaRN();
                    try {
                        parametros.put("biblioteca", bRN.listar().get(0));
                    } catch (Exception e) {
                    }
                    if (!"".equals(itensOperadorInConsulta)) {
                        parametros.put("sql", "(" + itensOperadorInConsulta + ")  and exeem.operacao in (2,3) and "
                                + "emp.idemprestimo=" + emprestimo.getIdEmprestimo());
                    } else {
                        parametros.put("sql", emprestimo.getIdEmprestimo());
                    }

                    if (seEemprestimo) {
                        //imprime recibo emprestimo

                        try {
                            JDialog viewer = new JDialog(new javax.swing.JFrame(), "Visualização do Relatório", true);
                            viewer.setSize(1000, 600);
                            viewer.setLocationRelativeTo(null);
                            viewer.setModal(true);
                            pathjrxml = JasperCompileManager.compileReport("src/relatorios/RelReciboEmprestimo.jrxml");
                            JasperPrint printReport = JasperFillManager.fillReport(pathjrxml, parametros,
                                    connection);
                            JasperExportManager.exportReportToPdfFile(printReport, "src/relatorios/RelReciboEmprestimo.pdf");
                            JasperViewer jv = new JasperViewer(printReport, false);
                            viewer.getContentPane().add(jv.getContentPane());
                            viewer.setVisible(true);
                            // jv.setVisible(true);
                        } catch (JRException ex) {
                            Logger.getLogger(TelaPrincipal.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    } else {
                        try {
                            JDialog viewer = new JDialog(new javax.swing.JFrame(), "Visualização do Relatório", true);
                            viewer.setSize(1000, 600);
                            viewer.setLocationRelativeTo(null);
                            viewer.setModal(true);
                            pathjrxml = JasperCompileManager.compileReport("src/relatorios/RelReciboDevRen.jrxml");
                            JasperPrint printReport = JasperFillManager.fillReport(pathjrxml, parametros,
                                    connection);
                            JasperExportManager.exportReportToPdfFile(printReport, "src/relatorios/RelReciboDevRen.pdf");
                            JasperViewer jv = new JasperViewer(printReport, false);
                            viewer.getContentPane().add(jv.getContentPane());
                            viewer.setVisible(true);

                        } catch (JRException ex) {
                            Logger.getLogger(TelaPrincipal.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }


                    limpaCampos();
                }
            }
        }
    }//GEN-LAST:event_btSalvar5ActionPerformed

    private void btPesquisar6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btPesquisar6ActionPerformed
        List<Leitor> lista = leitorRN.listar();
        LeitorTableModel itm = new LeitorTableModel(lista);
        Object o = TelaPesquisa.exibeTela(itm, "Leitor");
        if (o != null) {
            Calendar datas = Calendar.getInstance();
            leitor = leitorRN.pesquisarCodigo(Short.parseShort(o.toString()));
            DateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");
            String data = fmt.format(Calendar.getInstance().getTime()), dia = data.substring(0, 2),
                    mes = data.substring(3, 5), ano = data.substring(6, 10);
            Calendar calendario = new GregorianCalendar(Integer.parseInt(dia), Integer.parseInt(mes),
                    Integer.parseInt(ano));
            calendario.setTime(new Date());
            calendario.add(Calendar.DATE, leitor.getGruposLeitores().getDuracaoDiasEmprestimo());
            tfDataEmprestimoDia.setText(dia);
            tfDataEmprestimoMes.setText(mes);
            tfDataEmprestimoAno.setText(ano);
            String day = fmt.format(calendario.getTime()), mother = day, year = day;

            tfLeitor.setText(leitor.getNome());
            EmprestimoRN eRN = new EmprestimoRN();
            int qtdLivrosEmprestados = eRN.pesquisarSituacao(leitor);
            if (qtdLivrosEmprestados > 0) {
                lblDevolucao.setText("Qtd Empréstimos: " + qtdLivrosEmprestados);
            } else {
                lblDevolucao.setText("");
            }
        }
        tfTombo.grabFocus();
    }//GEN-LAST:event_btPesquisar6ActionPerformed

    private void RemoveAcrActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RemoveAcrActionPerformed
        if (exemplares.isEmpty()) {
            JOptionPane.showMessageDialog(rootPane, "Não existem exemplares para remover!");
        } else {
            int tombo = pegaTomboSelecionado();
            if (tombo > 0) {
                Iterator<ExemplarEmprestimos> iterator = exemplares.iterator();
                while (iterator.hasNext()) {
                    if (iterator.next().getExemplar().getTombo() == tombo) {
                        iterator.remove();
                    }
                }
            }
        }
        atualizaTabela();

    }//GEN-LAST:event_RemoveAcrActionPerformed

    private int pegaTomboSelecionado() {
        int row = tbExemplaresEmprestimo.getSelectedRow();

        if (row > -1) { //então tem ítem selecionado  
            Object value = tbExemplaresEmprestimo.getValueAt(row, 0);
            short id;
            return id = (short) Short.valueOf(String.valueOf(value));

        } else {
            JOptionPane.showMessageDialog(rootPane, "Selecione a Linha!",
                    "ERRO", JOptionPane.ERROR_MESSAGE);
        }
        return 0;

    }

    private void btAdicionarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btAdicionarActionPerformed


        if (!tfTombo.getText().equals("")) {
            EmprestimoRN empRN = new EmprestimoRN();
            ExemplarRN eRN = new ExemplarRN();
            ExemplarEmprestimosRN exemRN = new ExemplarEmprestimosRN();
            Exemplar exemplar = eRN.pesquisarTombo(Short.valueOf(tfTombo.getText()));
            if (exemplar != null) {
                if (exemplar.isAtivo() == true) {
                    if (exemplar.getSituacao() != 3) {
                        if (tfLeitor.getText().equals("")) {
                            JOptionPane.showMessageDialog(rootPane, "Informe o Leitor!", "OSBiblio", JOptionPane.INFORMATION_MESSAGE);
                        } else {
                            MultaRN mulRN = new MultaRN();
                            boolean temMulta = mulRN.pesquisarSeTemEmAbertoMulta(leitor);
                            if (temMulta) {
                                JOptionPane.showMessageDialog(rootPane, "O leitor Possui Multa!", "OSBiblio", JOptionPane.INFORMATION_MESSAGE);
                            } else {

                                Iterator<ExemplarEmprestimos> iExemEmpre = exemplares.iterator();
                                boolean podeFazerEmprestimo = true;
                                while (iExemEmpre.hasNext()) {
                                    ExemplarEmprestimos exempEmpres = iExemEmpre.next();
                                    if (exempEmpres.getOperacao() == 2 || exempEmpres.getOperacao() == 3) {
                                        podeFazerEmprestimo = false;
                                    }
                                }
                                if (podeFazerEmprestimo) {
                                    if ((exemplares.size() + empRN.pesquisarSituacao(leitor))
                                            < leitor.getGruposLeitores().getQuantMaxLivros()) {
                                        if (exemplar.getSituacao() != 4) {

                                            exemplarEmprestimo = new ExemplarEmprestimos();
                                            exemplarEmprestimo.setExemplar(exemplar);
                                            exemplarEmprestimo.setOperacao(1);

                                            try {

                                                exemplarEmprestimo.setDataEmprestimo(new Date());
                                                Date d = new Date();
                                                Calendar c = Calendar.getInstance();
                                                c.add(Calendar.DAY_OF_WEEK, leitor.getGruposLeitores().getDuracaoDiasEmprestimo());
                                                d = c.getTime();
                                                exemplarEmprestimo.setDataPrevistaDevolucao(d);
                                            } catch (Exception ex) {
                                                System.out.println(ex.getMessage());
                                            }
                                            //verifica se já tem um tombo igual já inserido
                                            Iterator<ExemplarEmprestimos> iteratorTombo = exemplares.iterator();
                                            boolean possuiTombo = false;
                                            while (iteratorTombo.hasNext()) {
                                                ExemplarEmprestimos eemp = iteratorTombo.next();
                                                if (eemp.getExemplar().getTombo() == exemplar.getTombo()) {
                                                    possuiTombo = true;
                                                }
                                            }

                                            //verifica se já tem um tombo igual já inserido
                                            Iterator<ExemplarEmprestimos> iteratorAcervo = exemplares.iterator();
                                            boolean possuiAcervo = false;
                                            while (iteratorAcervo.hasNext()) {
                                                ExemplarEmprestimos eemp = iteratorAcervo.next();
                                                if (eemp.getExemplar().getAcervo().getIdAcervo()
                                                        == exemplar.getAcervo().getIdAcervo()) {
                                                    possuiAcervo = true;
                                                }
                                            }

                                            if (possuiAcervo) {
                                                JOptionPane.showMessageDialog(rootPane, "Já existe um Exemplar com esse Acervo na lista de Empréstimo!");
                                            } else if (possuiTombo) {
                                                JOptionPane.showMessageDialog(rootPane, "Já existe um Exemplar com esse Tombo na lista de Empréstimo!");
                                            } else {
                                                exemplares.add(exemplarEmprestimo);
                                            }
                                            atualizaTabela();


                                        } else {
                                            JOptionPane.showMessageDialog(rootPane, "Este Exemplar encontra-se \n Indisponível Para Empréstimos!", "OSBiblio", JOptionPane.INFORMATION_MESSAGE);
                                        }

                                    } else {
                                        JOptionPane.showMessageDialog(rootPane, "Quantidade Máxima \n de Livors Atingida!", "OSBiblio", JOptionPane.INFORMATION_MESSAGE);
                                    }

                                } else {
                                    JOptionPane.showMessageDialog(rootPane, "Termine a Operação \n De Devolução/Renovação!", "OSBiblio", JOptionPane.INFORMATION_MESSAGE);
                                }
                            }
                        }

                    } else {
                        Iterator<ExemplarEmprestimos> iExemEmpre = exemplares.iterator();
                        boolean podeFazerDevolucao = true;
                        while (iExemEmpre.hasNext()) {
                            ExemplarEmprestimos exempEmpres = iExemEmpre.next();
                            if (exempEmpres.getOperacao() == 1) {
                                podeFazerDevolucao = false;
                            }
                        }
                        if (podeFazerDevolucao) {

                            DateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");
                            String data = fmt.format(Calendar.getInstance().getTime()), dia = data.substring(0, 2),
                                    mes = data.substring(3, 5), ano = data.substring(6, 10);
                            Calendar calendario = new GregorianCalendar(Integer.parseInt(dia), Integer.parseInt(mes),
                                    Integer.parseInt(ano));
                            calendario.setTime(new Date());

                            tfDataEmprestimoDia.setText(dia);
                            tfDataEmprestimoMes.setText(mes);
                            tfDataEmprestimoAno.setText(ano);

                            btPesquisar6.setEnabled(false);
                            short codigoEmprestimo = empRN.pesquisarEmprestimoLivroDevolvido(exemplar);

                            if (emprestimo == null) {
                                emprestimo = empRN.pesquisarCodigo(codigoEmprestimo);
                                leitor = emprestimo.getLeitor();
                                tfLeitor.setText(emprestimo.getLeitor().getNome());
                            }
                            if (codigoEmprestimo != emprestimo.getIdEmprestimo()) {
                                JOptionPane.showMessageDialog(rootPane, "O Tombo inserido não fez \n parte deste Empréstimo!", "OSBiblio", JOptionPane.INFORMATION_MESSAGE);
                            } else {

                                exemplarEmprestimo = exemRN.pesquisarCodigo(
                                        exemRN.pesquisarIdExemplarEmprestimoDevolvido(exemplar));
                                exemplarEmprestimo.setExemplar(exemplar);


                                int i = TelaOperacaoEmprestimoDevolucao.operacaoEprestimoDevolucao(exemplar);
                                if (i > 0) {


                                    try {
                                        if (i == 2) {
                                            //coloca data de devolução
                                            exemplarEmprestimo.setDataDevolucao(new Date());
                                            exemplarEmprestimo.setOperacao(i);

                                            exemplares.add(exemplarEmprestimo);
                                        } else {
                                            //renova o livro
                                            int quantDiasLivros = Util.diferencaData(exemplarEmprestimo.getDataEmprestimo(),
                                                    new Date());
                                            if (quantDiasLivros > leitor.getGruposLeitores().getDuracaoDiasEmprestimo()) {
                                                JOptionPane.showMessageDialog(rootPane, "O Exemplar não pode ser renovado! "
                                                        + "\n Ultrapassou a quantidade de dias "
                                                        + "\n exigidos pelo Grupo de Leitores do Leitor! Devolva o Livro!", "OSBiblio", JOptionPane.INFORMATION_MESSAGE);
                                            } else {
                                                exemplarEmprestimo.setDataEmprestimo(new Date());
                                                Date d = new Date();
                                                Calendar c = Calendar.getInstance();
                                                c.add(Calendar.DAY_OF_WEEK, leitor.getGruposLeitores().getDuracaoDiasEmprestimo());
                                                d = c.getTime();
                                                exemplarEmprestimo.setDataPrevistaDevolucao(d);
                                                exemplarEmprestimo.setOperacao(i);

                                                exemplares.add(exemplarEmprestimo);
                                            }
                                        }
                                    } catch (Exception ex) {
                                        System.out.println(ex.getMessage());
                                    }

                                    atualizaTabela();
                                }
                            }

                        } else {
                            JOptionPane.showMessageDialog(rootPane, "Termine a Operação De Empréstimo!", "OSBiblio", JOptionPane.INFORMATION_MESSAGE);
                        }
                    }
                } else {
                    JOptionPane.showMessageDialog(rootPane, "Exemplar Inativo!", "OSBiblio", JOptionPane.INFORMATION_MESSAGE);
                }
            } else {
                JOptionPane.showMessageDialog(rootPane, "Exemplar não existe!", "OSBiblio", JOptionPane.INFORMATION_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(rootPane, "Preencha o Tombo!", "OSBiblio", JOptionPane.INFORMATION_MESSAGE);
        }
        tfTombo.setText("");
    }//GEN-LAST:event_btAdicionarActionPerformed

    private void lblDevolucaoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblDevolucaoMouseClicked
        // TODO add your handling code here:
        List<ExemplarEmprestimos> lista = emprestimoRN.pesquisarExemplaresEmprestados(leitor);
        TelaConsultaLivrosEmprestados.livrosEmprestados(lista);
    }//GEN-LAST:event_lblDevolucaoMouseClicked

    private void tfTomboKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tfTomboKeyReleased
        
    }//GEN-LAST:event_tfTomboKeyReleased

    private void tfTomboKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tfTomboKeyPressed
        // TODO add your handling code here:
        if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
            btAdicionarActionPerformed(null);
        }
    }//GEN-LAST:event_tfTomboKeyPressed

    private void limpaCampos() {
        emprestimo = null;
        leitor = null;
        exemplares = new HashSet<>();
        tfDataEmprestimoDia.setText("");
        tfDataEmprestimoMes.setText("");
        tfDataEmprestimoAno.setText("");
        tfLeitor.setText("");
        lblDevolucao.setText("");
        atualizaTabela();
        btPesquisar6.setEnabled(true);
        tfTombo.grabFocus();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Windows".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TelaCadastroEmprestimos.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TelaCadastroEmprestimos.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TelaCadastroEmprestimos.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TelaCadastroEmprestimos.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the dialog */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                TelaCadastroEmprestimos dialog = new TelaCadastroEmprestimos();
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    @Override
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton RemoveAcr;
    private javax.swing.JButton btAdicionar;
    private javax.swing.JButton btNovo5;
    private javax.swing.JButton btPesquisar6;
    private javax.swing.JButton btSair5;
    private javax.swing.JButton btSalvar5;
    private javax.swing.JLabel jLabel21;
    private javax.swing.JLabel jLabel22;
    private javax.swing.JPanel jPanel7;
    private javax.swing.JPanel jPanel9;
    private javax.swing.JScrollPane jScrollPane5;
    private javax.swing.JLabel labelDataDevolucao17;
    private javax.swing.JLabel labelDataEmprestimo5;
    private javax.swing.JLabel labelDataEmprestimo7;
    private javax.swing.JLabel labelEmprestimo;
    private javax.swing.JLabel lblDevolucao;
    public javax.swing.JTable tbExemplaresEmprestimo;
    private javax.swing.JFormattedTextField tfDataEmprestimoAno;
    private javax.swing.JFormattedTextField tfDataEmprestimoDia;
    private javax.swing.JFormattedTextField tfDataEmprestimoMes;
    private javax.swing.JTextField tfLeitor;
    private javax.swing.JTextField tfTombo;
    // End of variables declaration//GEN-END:variables
}
